/**
 * 
 */
package edu.university.demo.system.controller;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.smallchill.core.toolbox.kit.FileKit;

import edu.university.demo.common.AjaxResult;
import edu.university.demo.common.ShiroUser;
import edu.university.demo.core.constant.Cst;
import edu.university.demo.core.shiro.ShiroKit;
import edu.university.demo.system.entit.Song;
import edu.university.demo.system.service.SongService;

/**
 * 歌曲列表
 * 
 * 基于MVP模式的RESTful架构
 * 
 * 随着UI创建技术的功能日益增强，UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能，
 * 让View专注于处理数据的可视化以及与用户的交互，同时让Model只关系数据的处理，基于MVC概念的MVP(Model-View-Presenter)
 * 模式应运而生。 在MVP模式里通常包含4个要素： (1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
 * (2)View interface:需要View实现的接口，View通过View
 * interface与Presenter进行交互，降低耦合，方便进行单元测试; (3)Model:负责存储、检索、操纵数据(有时也实现一个Model
 * interface用来降低耦合); (4)Presenter:作为View与Model交互的中间纽带，处理与用户交互的负责逻辑。
 * 
 * RESTful架构： （1）每一个URI代表一种资源； （2）客户端和服务器之间，传递这种资源的某种表现层；
 * （3）客户端通过四个HTTP动词，对服务器端资源进行操作，实现"表现层状态转化"。
 * 
 * 
 * @author mayanping
 */
@RestController
@RequestMapping(value = "/song")
public class SongPresenter extends BaseController {

	@Autowired
	private SongService songService;

	/**
	 * 查询所有歌曲
	 */
	@RequestMapping(value="/list", method=RequestMethod.POST)
	public Map<String, List<Song>> getSongs() {
		Map<String, List<Song>> songMap = Maps.newHashMap();
		songMap.put("list", songService.getAllSong());
		return songMap;
	}
	
	/**
	 * 根据id加载歌曲
	 */
	@ResponseBody
	@RequestMapping("/get/{id}")
	public Song getSong(@PathVariable("id") Long id) {
		return songService.getSong(id);
	}

	/**
	 * 分页查询所有歌曲
	 * 
	 * @param 请求格式:http://localhost:8080/root/song/qList?number=1&size=5
	 */
	@RequestMapping("/qList")
	public List<Song> getSongs(@RequestParam(value = "number", defaultValue = "1") int number,
			@RequestParam(value = "size", defaultValue = "5") int size) {
		Page<Song> page = songService.getAllSong(number, size);
		return page.getContent();
	}

	/**
	 * 分页查询所有歌曲
	 * 
	 * @param ajax请求方式:json
	 *            {number : 1,size : 5}
	 * 
	 */
	// @RequestMapping("/jList")
	// public List<Song> getSongs(@RequestBody String json){
	// try {
	// JSONObject jsonObj = new JSONObject(json);
	// int number =jsonObj.getInt("number");
	// int size = jsonObj.getInt("size");
	// return songService.getAllSong(number, size).getContent();
	// } catch (JSONException e) {
	// // TODO Auto-generated catch block
	// logger.trace("参数json有误，请检查json的格式", e);
	// }
	// return Lists.newArrayList();
	//
	// }

	/**
	 * 我的歌曲
	 */
	@RequestMapping("/mySong")
	public Map<String, List<Song>> getMySongs() {
		
		Map<String, List<Song>> songMap = Maps.newHashMap();
		List<Song> songList = Lists.newArrayList();
		ShiroUser shiroUser = ShiroKit.getUser();
		if(shiroUser == null) {
			return null;
		}
		String loginName = shiroUser.toString();

		songList = songService.getMySong(loginName);
		songMap.put("list", songList);
		return songMap;
	}
	
	/**
	 *  收藏歌曲
	 */
	@RequestMapping("/saveSong")
	public Map<String, Integer> saveSong(@RequestParam("id")Long songId, Integer hobbyTag) {
		
		Map<String, Integer> map = Maps.newHashMap();
		int code = 1;
		try {
			ShiroUser shiroUser = ShiroKit.getUser();
			String loginName = shiroUser.getLoginName();
			if(hobbyTag == 1) {
				songService.saveSong(songId, loginName);
			}else if(hobbyTag == 0) {
				songService.removeSong(songId, loginName);
			}
		} catch (Exception e) {
			e.printStackTrace();
			code = 0;
		}
		map.put("code", code);
		return map;
	}
	
	//增加播放量
	@RequestMapping("/increase")
	public void increase(Long id) {
		
		songService.increase(id);
	}
	
	//把歌词文件转为String返回给前台
	@RequestMapping("/lyric")
	public Map<String, String> getLyric(String lyricName) {
		
		Map<String, String> map = Maps.newHashMap();
		String lyric = null;
		try {
			lyric = 
					FileKit.readString(Cst.me().getRealPath() +"/static/data/lyric/" + lyricName, "GBK");
		} catch (IOException e) {
			e.printStackTrace();
			lyric = "";
		}
		map.put("lyric", lyric);
		return map;
	}
}
